package Game.utils;

import Game.entity.*;
import Game.functions.Collidable;
import Game.functions.Hitable;
import Game.functions.Recyclable;
import org.lwjgl.input.Keyboard;

import java.io.IOException;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;

public  class TankGameWindow extends Window {

    public TankGameWindow(String title, int width, int height, int fps) {
        super(title, width, height, fps);
    }

    Tank tank;
    Element e;
    EnemyTank et;
    long eatbufftime;
    Buff buff;
    Boss boss;
    boolean flag;

//    BrickWall bw;
//    GrassWall gw;

//    ArrayList<BrickWall> bws = new ArrayList<>();
//    ArrayList<GrassWall> gws = new ArrayList<>();

    //  ArrayList集合不支持在 增强for 或者 迭代器遍历 时修改集合结构
//  List<Element> es = new ArrayList<>();
    List<Element> es = new CopyOnWriteArrayList<Element>();

    @Override
   protected void onCreate() {

        tank = new Tank(512, 512);
        et = new EnemyTank(512, 0);
        buff = new Buff(15 * 64,512);
        boss = new Boss(64*11, 64*11);
        es.add(buff);
        es.add(tank);
        es.add(et);
        es.add(boss);

        //循环的次数 屏幕的宽度/64
        for (int i = 0; i < Meta.WIDTH / 64; i++) {
            if ((i >= 3 && i <= 5) || (i >= 12 && i <= 16)) {
                e = new GrassWall((i * 64), 64);
                es.add(e);
            } else {
                e = new BrickWall((i * 64), 64);
                es.add(e);
            }
        }

        for (int i = 0; i < Meta.WIDTH / 64 - 3; i++) {
            if (i >= 8 && i <= 13) {
                e = new GrassWall((i * 64) + 192, 192);
                es.add(e);
            } else {
                e = new SteelWall((i * 64) + 192, 192);
                es.add(e);
            }
        }

        for (int i = 0; i < Meta.WIDTH / 64 - 7; i++) {
            if (i % 2 == 0) {
                e = new BrickWall((i * 64) + 384, 320);
                es.add(e);
            } else {
                e = new SteelWall((i * 64) + 384, 320);
                es.add(e);
            }
        }

        for (int i = 0; i < Meta.WIDTH / 64 - 11; i++) {
            e = new BrickWall((i * 64) + 512, 448);
            es.add(e);
        }

        for (int i = 0; i < Meta.WIDTH / 64 - 13; i++) {
            e = new SteelWall((i * 64) + 512 + 192, 448 + 128);
            es.add(e);
        }

        for (int i = 0; i < Meta.WIDTH / 64 - 19; i++) {
            e = new BrickWall((i * 64) + 640, 640);
            es.add(e);
        }

        for (int i = 0; i < 3; i++) {
            if (i == 1) continue;
            e = new BrickWall((i * 64) + 640, 640 + 64);
            es.add(e);
        }

        for (int i = 0; i < Meta.HEIGHT / 64 - 2; i++) {
            if (i == 8) continue;
            e = new WaterWall(64, (i * 64) + 128);
            es.add(e);
        }

        for (int i = 0; i < Meta.HEIGHT / 64 - 5; i++) {
            if (i == 8) continue;
            e = new BrickWall(256, (i * 64) + 256);
            es.add(e);
        }

        for (int i = 0; i < Meta.HEIGHT / 64 - 7; i++) {
            e = new WaterWall(448 - 64, (i * 64) + 448);
            es.add(e);
        }

        for (int i = 0; i < 2; i++) {
            e = new WaterWall(1024, (i * 64) + 640);
            es.add(e);
        }

        for (int i = 0; i < Meta.HEIGHT / 64 - 6; i++) {
            if (i == Meta.HEIGHT / 64 - 6 - 1) break;
            e = new BrickWall(1280, (i * 64) + 384);
            es.add(e);
        }

//        for (int i = 0; i < Meta.WIDTH / 64; i++) {
//            if (i >= 3 && i <= 5) {
//                gw = new GrassWall((i * 64), 64);
//                gws.add(gw);
//            } else {
//                bw = new BrickWall((i * 64), 64);
//                bws.add(bw);
//            }
//        }
//
//        for (int i = 0; i < Meta.HEIGHT / 64; i++) {
//            if (i >= 3 && i <= 5) {
//                gw = new GrassWall(64, (i * 64));
//                gws.add(gw);
//            } else {
//                bw = new BrickWall(64, (i * 64));
//                bws.add(bw);
//            }
//        }

//        tank = new Tank(512,512);
//        this.tank = tank;
//        bw = new BrickWall();
//        gw = new GrassWall();

        try {
            SoundUtils.play("15-Tankwar\\audio\\start.wav", false);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    @Override
    protected void onDisplayUpdate() {

        if (flag) {
            try {
               DrawUtils.draw("15-Tankwar\\images\\over.jpg", Meta.WIDTH/2, Meta.HEIGHT/2);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return;
        }

//        System.out.println("游戏元素个数：" + es.size());

//        tank.draw();
//        es.forEach(Element::draw);

//        bws.forEach(BrickWall::draw);
//        gws.forEach(GrassWall::draw);

//        bw.draw();

//        try {
//            DrawUtils.draw("15-Tankwar\\images\\tank_u.gif", 0, 0);
//        } catch (IOException e) {
//            throw new RuntimeException(e);
//        }
//        tank.draw();


//        注意这里{}一定要检查好它的范围，括错了会导致元素不会移出集合，又tm吃大亏
        for (Element e : es) {
            e.draw();

            if (e instanceof Recyclable) {
                if (((Recyclable) e).isOutside()) {
                    es.remove(e);
                }
            }

            if (e instanceof EnemyTank) {
                EnemyTank etank = (EnemyTank) e;
                Bullet bullet = etank.fire();
                if (bullet != null) {
                    es.add(bullet);
                }
            }

            if (e instanceof Boss && e instanceof Recyclable) {
                Boss boss = (Boss) e;
                if (boss.isOutside()) {
                    es.clear();
                    flag = true;
                }
            }

//                if (e instanceof Blast) {
//                    if (((Blast) e).isOutside()) {
//                        es.remove(e);
//                    }
//                }
//                if (e instanceof BrickWall) {
//                    if (((BrickWall) e).isOutside()) {
//                        es.remove(e);
//                    }
//                }
//                if (e instanceof SteelWall) {
//                    if (((SteelWall) e).isOutside()) {
//                        es.remove(e);
//                    }
//                }
            }
//      碰撞校验，运用接口只用判断一次
        for (Element e1 : es) {
            if (e1 instanceof Tank) {
                Tank tank = (Tank) e1;

                for (Element e2 : es) {
                    if (e2 instanceof Collidable) {

                        boolean flag = tank.isCollide(e2);

                        if (flag) {
                            break;
                        }
                    }
                }
            }
        }

        for (Element e1 : es) {
            if (e1 instanceof EnemyTank) {
                EnemyTank etank = (EnemyTank) e1;

                for (Element e2 : es) {
                    if (e2 instanceof Collidable) {

                        boolean flag = etank.isCollide(e2);

                        if (flag) {
                            break;
                        }
                    }
                }
            }
        }

        for (Element e1 : es) {
            if (e1 instanceof Bullet) {
                Bullet bullet = (Bullet) e1;

                for (Element e2 : es) {
                    if (e2 instanceof Hitable) {
                        boolean flag = bullet.isCollide(e2);
//                        如果flag为true说明墙和子弹发生了碰撞
                        if (flag) {
                            es.remove(e1);//移除的是子弹
                            try {
                                SoundUtils.play("15-Tankwar\\audio\\blast.wav");
                            } catch (IOException ex) {
                                throw new RuntimeException(ex);
                            }
                            Hitable h = (Hitable) e2;
                                Blast blast = h.showBlast();
                                if (blast != null) {
                                    es.add(blast);
                                    break;
                    }
                }
            }
        }
    }
}

        for (Element e1 : es) {
            if (e1 instanceof Buff) {
                Buff buff = (Buff) e1;

                for (Element e2 : es) {
                    if (e2 instanceof Tank) {
                        Tank tank = (Tank) e2;

                        boolean flag = buff.isCover(tank);

                        if (flag) {
                            tank.direction = 32;
                            eatbufftime = System.currentTimeMillis();
                            es.remove(e1);
                            break;
                        }
                    }
                }
            }
        }

        if (System.currentTimeMillis() - eatbufftime > 5000) {
            tank.direction = 16;
        }

//        for(Element e1 : es){
//            if(e1 instanceof Tank){
//               Tank tank = (Tank) e1;
//
//                    for (Element e2 : es) {
//                        if (e2 instanceof BrickWall) {
//                            BrickWall brickWall = (BrickWall) e2;
//
//                            boolean flag = tank.isCollide(brickWall);
//
//                            if(flag){
//                              System.out.println("碰撞了");
//                              碰撞后要立马中断，否则会和其他墙继续校验
//                                break;
//                            }
//                        }
//                        if (e2 instanceof SteelWall) {
//                            SteelWall steelWall = (SteelWall) e2;
//
//                                boolean flag = tank.isCollide(steelWall);
//
//                                if(flag){
//                                    break;
//                                }
//                            }
//                        if (e2 instanceof WaterWall) {
//                            WaterWall waterWall = (WaterWall) e2;
//
//                                    boolean flag = tank.isCollide(waterWall);
//
//                                    if (flag) {
//                                        break;
//                                    }
//                        }
//                    }
//            }
//        }
    }

    /**
     * 键盘事件 按下按键触发
     *
     * @param key 按键，{@code Keyboard.key_xx}
     */
    @Override
    protected void onKeyEvent(int key) {
        switch (key) {
            case Keyboard.KEY_W:
                tank.move(Direction.UP);
                break;
            case Keyboard.KEY_S:
                tank.move(Direction.DOWN);
                break;
            case Keyboard.KEY_A:
                tank.move(Direction.LEFT);
                break;
            case Keyboard.KEY_D:
                tank.move(Direction.RIGHT);
                break;
            case Keyboard.KEY_SPACE:
                Bullet bullet = tank.fire();
                if (bullet != null) {
                    es.add(bullet);
                }
                break;
//              敌方坦克控制开关
//            case Keyboard.KEY_UP:
//                et.move(Direction.UP);
//                break;
//            case Keyboard.KEY_DOWN:
//                et.move(Direction.DOWN);
//                break;
//            case Keyboard.KEY_LEFT:
//                et.move(Direction.LEFT);
//                break;
//            case Keyboard.KEY_RIGHT:
//                et.move(Direction.RIGHT);
//                break;
        }
    }

    @Override
    protected void onMouseEvent(int key, int x, int y) {
        System.out.println(key + ":" + x + ":" + y);
    }
}
